<html>
    <head>
        <title>根据应用服务生成 HTTP API 的规则</title>
    </head>
    <body>
        <script>
            /*
                        二、根据应用服务生成API的规则：  
                    
                    
                                根据应用服务接口自动生成API的例子：

                                    服务方法名称                                    HTTP方法                    路由
                                    
                                ①、GetAsync(Guid id)                                GET                        /api/app/book/{id}

                                ②、GetListAsync()                                   GET                        /api/app/book

                                ③、UpdateAsync(Guid id, UpdateBookDto input)        Put                        /api/app/book/{id}

                                ④、DeleteAsync(Guid id)                             Delete                     /api/app/book/{id}

                                ⑤、GetEditorsAsync(Guid id)                         GET                        /api/app/book/{id}/editors

                                ⑥、CreateEditorAsync(Guid id, BookEditorCreateDto input) Post                  /api/app/book/{id}/editor


                    
                                1、Http方法与 应用服务方法名称之间的映射关系

                                                    ①、Get：如果方法名称以'GetList'、'GetAll'或'Get'开头

                                                    ②、put：如果方法名称以'put'或'Update'开头

                                                    ③、Delete：如果方法名称以'Delete'或'Remove'开头

                                                    ④、Post：如果方法名称以“创建”、“添加”、“插入”或“发布”开头

                                                    ⑤、atch：如果方法名称以“Patch”开头

                                                    ⑥、否则，Post默认使用。



                                                    如果您需要为特定方法自定义HTTP方法，
                                                    
                                                    那么您可以使用标准的ASP.NET核心属性之一（[HttpPost]、[HttpGet]、[Httpput]…等等）。
                                                    
                                                    这需要将Microsoft. AspNetCore.Mvc.Corenuget包添加到包含该服务的项目中。


                                2、路由的生成规则：

                                        路由是根据一定约定计算的：

                                                ①、 它总是以'/api'开头。

                                                ②、 接着是"根路径"。默认值为'/app'，可以如下配置：

                                                            Configure<AbpAspNetCoreMvcOptions>(options =>
                                                            {
                                                                options.ConventionalControllers
                                                                    .Create(typeof(BookStoreApplicationModule).Assembly, opts =>
                                                                        {
                                                                            opts.RootPath = "volosoft/book-store";  // 配置自动api的根路径
                                                                        });
                                                            });

                                                            那么范文api获取一本书的路径将是'/api/volosoft/book-store/book/{id}'。此示例使用两级根路径，但您通常使用单级根路径。

                                                ③、接着是规范化的控制器/服务名称.
                                                            
                                                            规范化删除“AppService”、“Application ationService”和“Service”后缀，并将其转换为kebab-case。

                                                            如果您的应用程序服务类名是“ReadingBookAppService”，则它变成只有“/reading-book”。

                                                            （如果要自定义命名，请设置UrlControllerNameNormalizer选项。这是一个func委托，允许您确定每个控制器/服务的名称。）

                                                ④、如果该方法具有“id”参数，则它会在路由中添加“/{id}”。


                                                ⑤、然后在必要时添加操作名称。

                                                            操作名称从服务上的方法名称中获取，并通过规范化：

                                                                    -1-删除“Async”后缀。
                                                                    
                                                                            如果方法名称是“GetPhonesAsync”，则它变为“GetPhones”。

                                                                    -2-删除HTTP方法前缀

                                                                            “GetList”、“GetAll”、“Get”、“放置”、“更新”、“删除”、“删除”、“创建”、“添加”、“插入”、“发布”和“补丁”前缀将根据所选的HTTP方法删除。
                                                                            
                                                                            因此，“GetPhones”变成了“Phones”，因为“Get”前缀是GET请求的重复。

                                                                    -3-将结果转换为kebab-case。

                                                                    -4-如果生成的操作名称为空，则不会将其添加到路由中。
                                                                    
                                                                            如果它不为空，则将其添加到路由中（如“/phone”）。对于“GetAllAsync”方法名称，它将为空，对于“GetPhonesAsync”方法名称，它将为“phone”。

                                                                    -5- 可以通过设置UrlActionNameNormalizer选项来自定义规范化。
                                                                    
                                                                            它是为每个方法调用的操作委托。


                                                    ⑥、如果有另一个带有“Id”后缀的参数，则它也会作为最终路由段添加到路由中（如“/phoneId”）。

                                

                                        ★、自定义路线计算

                                                    IConventionalRouteBuilder用于构建路由，默认由ConventionalRouteBuilder实现，
                                                    
                                                    工作方式如上所述，可以替换/覆盖此服务来自定义路由计算策略。

                                                 3. x版样式路线计算：、
                                                 
                                                         4.0版本之前的路线计算不同。
                                                         
                                                         它使用camelCase约定，而ABP 4.0+版本使用kebab-case。如果您使用旧的路线计算策略，请遵循其中一种方法：

                                                                在options.ConventionalControllers.Create(...)方法。示例：

                                                                    options.ConventionalControllers
                                                                                            .Create(typeof(BookStoreApplicationModule).Assembly, opts =>
                                                                                                {
                                                                                                    opts.UseV3UrlStyle = true;
                                                                                                });
                                                                此方法仅影响BookStoreApplicationModule的控制器

                                                                为AbpConventionalControllerOptions将UseV3UrlStyle设置为true以全局设置。示例：

                                                                    Configure<AbpConventionalControllerOptions>(options =>
                                                                    {
                                                                        options.UseV3UrlStyle = true;
                                                                    });
                    */
        </script>
    </body>
</html>